<?php 
/**
 * 列表页控制器
 * @author 杨帆
 */
class ListController extends CommonController{
    /**
     * 默认显示
     */
    public function index(){
       //显示公用头部数据列表
        $this->commonShow();
        /**
        * 筛选
        */
       //获取分类内码；
       $cid = Q('get.cid',0,'intval');
       //获取分类所涉及的商品主键，注意_cidGetGid、_getSoncids方法；
       $gids = $this->_cidGetGid($cid);
       //判断
       if($gids){
            //2.通过gid找到所有对应商品属性,转到_getAttr方法；
            $attr = $this->_getAttr($gids);
            $this->assign('attr',$attr);
            //3.获得筛选的param数组
            //param参数(数组),最后拿到这个数组进行筛选
            //如果param存在，则按照_变成数组,如果不存在用array_fill填充0
            $param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, count($attr), 0);
            $this->assign('param',$param);
            //4.进行通过param里面的id，要筛选取交集，获得最终的gid
            $finalGids = $this->_filterGid($param,$gids);
            
        }else{//如果没有商品的时候
            //给个空数组就是为了在页面可以判断
            $finalGids = array();    
        }
        //判断数组是否为空
        if($finalGids){
            //分页处理
            $total = K('Goods')->where('gid in(' . implode(',',$finalGids) . ')')->count();
            $pageObj = new Page($total,10,3);// 传入总数,每页显示数量，显示几页
            //显示分页,show为方法;
            $page = $pageObj->show(2);
            //分配数据
            $this->assign('page',$page);
            //分配商品数据
            $goodsData = K('Goods')->where('gid in(' . implode(',',$finalGids) . ')')->limit($pageObj->limit())->all();
        }else{//当没有商品数据时
            $goodsData = 0;
        }
//      p($goodsData);
        $this->assign('goodsData',$goodsData);  
        $this->display(); 
    }
    
    /**
     * 通过param，获得商品gid
     */
    private function _filterGid($param,$gids){
        //读取属性数据,并将其属性中的0值的数据去掉
        $param = implode(',',array_filter($param));
        //判断$param是否为空,即判断用户是否全部点击“不限”,如有也就是点击了 “L” 或者 “红色”等相关属性
        if($param){
            //根据属性主键输出属性值名称;
            $data = M('goods_attr')->where("gaid in({$param})")->getField('ganame',true);
            //定义一个空数组
            $temp = array();
            //循环
            foreach ($data as $gid) {
                //将每个属性所对应的商品值压入数组;
                $temp[] = M('goods_attr')->where("ganame in('{$gid}')")->getField('goods_gid',true);           
            }
            //取得商品的交集
            $firstData = $temp[0];
                foreach ($temp as $v) {
                    //取得数组的上面二维数组的交际;array_intersect:取得数组的交际;
                    //第一步，自己和自己取交集
                    //第二步，自己和第二个$v取交集
                    //第三步，上次取好的交集和第三个$v取交集
                    $firstData = array_intersect($firstData, $v);
                } 
                //因为filterGids有可能不是当前分类，当前分类找到的gids和filterGids交集
                $finelData = array_intersect($firstData,$gids);
                return $finelData; 
        }else{
            //当用户全部点“不限”的时候，也就是默认的时候
            //那么就返回当前的分类查找出来的gid
            return $gids;    
        } 
    }

    /**
     * 通过gids找到商品的属性
     */
    private function _getAttr($gids){
        //查询
        $attr = M('goods_attr')->where("goods_gid in(" . implode(',', $gids) . ")")->group('ganame')->all();
        $attrFirst = array();
        //把相同的类型归结在一起
        foreach ($attr as $v) {
            $attrFirst[$v['attrid']][] = $v;
        }
        $attrSecond = array();
        //获得对应的类型属性名称，然后把对应的值也压入
        foreach ($attrFirst as $taid => $value) {
            $attrSecond[] = array(
                'name' => M('attribute')->where('attrid=' . $taid)->getField('title'),
                'value'=> $value
            );
        }
        return $attrSecond;
    }
    
    /**
     * 获取商品id
     */
    private function _cidGetGid($cid){
        //获取全部分类；
        $catagory = M('class')->all();
        //执行方法_getSoncids获取全部分类,并赋值给$cids；
        $cids = $this->_getSoncids($catagory,$cid);
        //再把传入的$cid分类加入数组中,保证数据完整性;
        $cids[] = $cid;
        //运用mysql的in函数和implode函数(将数组变为)
        $gids = M('goods')->where('class_cid in(' . implode(',', $cids) . ')')->getField('gid',true);
        return $gids;
    }
    
    /**
     * 获取子分类(递归)
     */
   private function _getSoncids($cataData,$cid){
       //定义临时数组
       $temp = array();
       //循环全部分类
       foreach ($cataData as $cata) {
           //如果找到传递进来的$cid的子分类时
           if($cata['fid']==$cid){
               //将子分类的cid压入,注意$temp[]的写法；
               $temp[] = $cata['cid'];
               //数组合并,并形成递归。注意array_merge第二个参数的写法;
               $temp = array_merge($temp,$this->_getSoncids($cataData,$cata['cid']));
           }    	
       }
       //返回数组
       return $temp;
   } 
 }
 
 
 
 
 
 
 
 
 
 
 




 ?>